﻿#pragma once
#include <define.h>
#include <market_api.h>
#include <event_center.hpp>
#include <mutex>
#include <condition_variable>
#include <params.hpp>
#include <../../api/TAP_V9_20200808/TapQuoteAPI.h>
#include <dll_helper.hpp>

// tap_api_market 类继承自 asyn_actual_market 和 ITapQuoteAPINotify，分别是异步市场数据处理和 TAP API 的通知接口
class tap_api_market : public asyn_actual_market, public ITapQuoteAPINotify
{
public:
    // 构造函数：初始化行情 API 对象并加载相关配置
    // 参数：
    // - id_excg_map: 交易所 ID 映射表
    // - config: 行情参数配置
    tap_api_market(const std::shared_ptr<std::unordered_map<std::string, std::string>>& id_excg_map, const params& config) noexcept;

    // 析构函数：用于清理资源
    virtual ~tap_api_market() noexcept;

// market_api 接口
public:
    // 登录函数：用于登录行情服务器
    // 返回值：登录成功返回 true，否则返回 false
    virtual bool login() noexcept override;

    // 登出函数：用于登出行情服务器并清理资源
    virtual void logout() noexcept override;

    // 订阅行情函数：订阅指定的合约行情
    // 参数：
    // - codes: 需要订阅的合约代码集合
    virtual void subscribe(const std::set<code_t>& codes) noexcept override;

    // 取消订阅行情函数：取消订阅指定的合约行情
    // 参数：
    // - codes: 需要取消订阅的合约代码集合
    virtual void unsubscribe(const std::set<code_t>& codes) noexcept override;

// ITapQuoteAPINotify 接口
public:
    // 登录响应回调：处理登录结果
    // 参数：
    // - errorCode: 错误码
    // - info: 登录响应信息
    virtual void TAP_CDECL OnRspLogin(TAPIINT32 errorCode, const TapAPIQuotLoginRspInfo* info) noexcept;

    // API 准备完成回调
    virtual void TAP_CDECL OnAPIReady() noexcept;

    // 连接断开回调
    // 参数：
    // - reasonCode: 断开原因代码
    virtual void TAP_CDECL OnDisconnect(TAPIINT32 reasonCode) noexcept;

    // 查询商品信息响应回调（未实现）
    virtual void TAP_CDECL OnRspQryCommodity(TAPIUINT32 sessionID, TAPIINT32 errorCode, TAPIYNFLAG isLast, const TapAPIQuoteCommodityInfo* info) noexcept {};

    // 查询合约信息响应回调（未实现）
    virtual void TAP_CDECL OnRspQryContract(TAPIUINT32 sessionID, TAPIINT32 errorCode, TAPIYNFLAG isLast, const TapAPIQuoteContractInfo* info) noexcept {};

    // 订阅行情响应回调
    // 参数：
    // - sessionID: 会话 ID
    // - errorCode: 错误码
    // - isLast: 是否是最后一条响应
    // - info: 行情信息
    virtual void TAP_CDECL OnRspSubscribeQuote(TAPIUINT32 sessionID, TAPIINT32 errorCode, TAPIYNFLAG isLast, const TapAPIQuoteWhole* info) noexcept;

    // 取消订阅行情响应回调
    // 参数：
    // - sessionID: 会话 ID
    // - errorCode: 错误码
    // - isLast: 是否是最后一条响应
    // - info: 合约信息
    virtual void TAP_CDECL OnRspUnSubscribeQuote(TAPIUINT32 sessionID, TAPIINT32 errorCode, TAPIYNFLAG isLast, const TapAPIContract* info) noexcept;

    // 行情数据通知回调
    // 参数：
    // - info: 行情数据
    virtual void TAP_CDECL OnRtnQuote(const TapAPIQuoteWhole* info) noexcept;

private:

    // TAP 行情 API 指针
    ITapQuoteAPI* _md_api;

    // 服务器连接信息
    std::string _ip;              // 服务器 IP 地址
    uint16_t _port;               // 服务器端口
    std::string _userid;          // 用户 ID
    std::string _password;        // 用户密码
    std::string _authcode;        // 用户认证码
    TAPIUINT32 _reqid;            // 请求 ID

    // 同步控制
    std::mutex _mutex;                            // 互斥锁
    std::unique_lock<std::mutex> _process_mutex;  // 用于条件变量的锁
    std::condition_variable _process_signal;      // 条件变量用于同步操作

    // 函数指针，用于创建和销毁 TAP 行情 API
    typedef ITapQuoteAPI* (*market_creator)(const TapAPIApplicationInfo*, TAPIINT32&);
    market_creator _tap_creator;   // TAP 行情 API 创建函数

    typedef void (*market_destroyer)(ITapQuoteAPI*);
    market_destroyer _tap_destroyer; // TAP 行情 API 销毁函数

    // 动态库句柄
    dll_handle _market_handle;

    // 状态变量
    bool _is_inited;    // 是否已初始化
    uint32_t _trading_day; // 当前交易日
};
